//异常的捕获
public class Test {
    public static void main1(String[] args) {
        try {
            test();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        //我们可以用throws来声明异常，从而让其他方法调用时候处理异常
        //这个时候用try catch来处理test方法的异常
    }

    public static void test() throws CloneNotSupportedException {
        int a = 0;
        if (a == 0) {
            //抛出一个自定义异常！
            throw new CloneNotSupportedException("a == 0");//这是一个受查异常
        }
        //throws是告诉方法的调用者，我抛出了一个异常，但是并没有处理掉这个异常
        //那么就是谁调用test方法谁处理了这个异常
    }



    public static void main2(String[] args) {
        /*
    try{

    }catch(要捕获的异常类型e){

    }[catch(异常类型e){

    }finally{

    }]
    []中的内容可选，可添加可不添加
     */

        //System.out.println(10 / 0);
        //这个异常没有被处理，它就会交给JVM来处理，一旦交给JVM来处理，程序就会异常终止
        //Process finished with exit code 1
        //最后这个值应该为0，不应该是1
        //所以我们要自己处理这个异常，而不是要让JVM来处理它
        //所以我们用try catch来处理
        try{
            //程序既然已经发生了异常 说明了这任务是有问题的，所以try中的代码将并不会被执行
            System.out.println(10 / 0);
        }/*catch (NullPointerException e){//这里面要放入到可能发生的异常类型
            System.out.println("捕获到了算数异常");
        }*/catch(ArithmeticException e){//这里面要放入到可能发生的异常类型
            System.out.println("捕获到了算数异常");
        }
        //这个时候程序就会自己能正常处理，且是要可以正常进行
        System.out.println("其他业务代码");
        //在这个时候，我们用catch一定要捕获对应的异常类型，如果不是对应的异常类型，那么还是无法处理掉这个异常,否则最后还是交给jvm来处理

        //那我们用Exception来用做异常类型，可是这么做并不会很好
        //Exception是所有异常的父类，我们不建议这样去写，因为这个时刻，异常太模糊了

        /*
        注意事项：
        1. try块内抛出异常位置之后的代码将不会被执行
        2. 如果抛出异常类型与catch时异常类型不匹配，即异常不会被成功捕获，也就不会被处理，继续往外抛，直到
        JVM收到后中断程序----异常是按照类型来捕获的
        3. try中可能会抛出多个不同的异常对象，则必须用多个catch来捕获----即多种异常，多次捕获
         */
    }


    public static void main(String[] args) {
        //这个时候try有多个异常对象，就要多次捕获
        int a = 0;
        try {
            System.out.println(10/a);
            int[] array = null;
            System.out.println(array.length);
        }catch (ArithmeticException e){
            System.out.println("捕获到了算数异常！");
            e.printStackTrace();//可以帮我们打印栈上的异常信息
        }catch (NullPointerException e){
            System.out.println("捕获到空指针异常！");
            e.printStackTrace();
        }catch (Exception e){//父类一般放到最后
            System.out.println("捕获到了异常");
        }

        /*
        //我们可以用连字符来连接起来写完了一个
        //其实也不建议这么写，还是比较模糊
        catch (ArithmeticException | NullPointerException e){
            System.out.println("捕获到了异常");
        }
        */
        System.out.println("其他业务代码");
    }

    //程序只会同时抛出一个异常，不会同时抛出了多个异常

    /*
    4.如果异常之间具有父子关系，一定是子类异常在前catch，父类异常在后catch，否则语法错误:
    如果我们把父类放前面会报错，一般是用来最后捕获异常的，catch也能捕获子类的异常对象
     */
}
